/**
 * 
 */
package cn.damong.utils.collections;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.ComparatorUtils;
import org.apache.commons.collections.comparators.ComparableComparator;
import org.apache.commons.lang.StringUtils;


/**
 * LIST工具类
 * 
 * @author CodingPanda
 * @2019年5月15日 下午11:23:21
 *
 */
@SuppressWarnings("rawtypes")
public class ListUtil {
    public static enum SortType{
        ASC(true), DESC(false);
        
        private boolean value;
        
        private SortType(boolean isAsc) {
            this.value = isAsc;
        }
    }

	/**
	 * 打印List的所有成员变量，成员变量的null字段也打印</br>
	 * log4j打印级别：DEBUG
	 * @param <T>
	 * @param list 要打印的list
	 */
	public static <T> void print(List<T> list) {
		if(CollectionUtils.isEmpty(list)){
			return;
		}
		for (T t : list) {
			ClassUtil.print(t);
		}
	}
	
	/**
	 * 打印List的所有成员变量，printNullField为true时打印null字段</br>
	 * log4j打印级别：DEBUG
	 * @param <T>
	 * @param list
	 * @param printNullField true时打印
	 */
	public static <T> void print(List<T> list, Boolean printNullField) {
		if(CollectionUtils.isEmpty(list)){
			return;
		}
		for (T t : list) {
			ClassUtil.print(t, printNullField);
		}
	}
	
	/**
	 * 打印List的所有成员变量的指定字段set，成员变量的null字段也打印</br>
	 * log4j打印级别：DEBUG
	 * @param <T>
	 * @param list
	 * @param fieldsSet
	 */
	public static <T> void print(List<T> list, Set<String> fieldsSet) {
		if(CollectionUtils.isEmpty(fieldsSet) || CollectionUtils.isEmpty(list)){
			return;
		}
		Set<String> fieldsSet2 = new HashSet<String>();
		for(String s : fieldsSet){
			fieldsSet2.add(s.toLowerCase());
		}
		for (T t : list) {
			ClassUtil.print(t, fieldsSet2);
		}
	}
	
	/**
	 * 将list的成员变量按照指定的字段排序
	 * @param <T>
	 * @param list
	 * @param fieldName
	 * @param asc true表示升序，false表示降序，null表示升序
	 */
	@SuppressWarnings("unchecked")
	public static <T> void sort(List<T> list, String fieldName, SortType asc){
		if (CollectionUtils.isEmpty(list) || StringUtils.isBlank(fieldName)) {
			return;
		}
		
		Comparator com = ComparableComparator.getInstance();
		com = ComparatorUtils.nullLowComparator(com);
		if (asc != null && asc == SortType.ASC) {
			com = ComparatorUtils.reversedComparator(com);
		}
		Comparator com2 = new BeanComparator(fieldName, com);
		Collections.sort(list, com2);
	}

}
